﻿        var a = 62;
        $("#BtnAddEval").click(function () {
            var code = $("#content").val();
            if (code != "") {
                encode();
            }
            else {
                pcjson_com_msg($("#content"), "请输入加密内容");
            }
        });
        $("#BtnClearEval").click(function () {
            var code = $("#content").val();
            if (code != "") {
                decode();
            }
            else {
                pcjson_com_msg($("#content"), "请输入解密内容");
            }
        });
        $("#BtnClear").click(function () {
            $("#content").val("");
           $("#result").html('');
        });
        function encode() {
            var code = $("#content").val();
            code = code.replace(/[\r\n]+/g, '');
            code = code.replace(/'/g, "\\'");
            var tmp = code.match(/\b(\w+)\b/g);
            tmp.sort();
            var dict = [];
            var i, t = '';
            for (var i = 0; i < tmp.length; i++) {
                if (tmp[i] != t) dict.push(t = tmp[i]);
            }
            var len = dict.length;
            var ch;
            for (i = 0; i < len; i++) {
                ch = num(i);
                code = code.replace(new RegExp('\\b' + dict[i] + '\\b', 'g'), ch);
                if (ch == dict[i]) dict[i] = '';
            }
            var rt = "eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}("
   + "'" + code + "'," + a + "," + len + ",'" + dict.join('|') + "'.split('|'),0,{}))";
			hightout(rt);
        }
        function num(c) {
            return (c < a ? '' : num(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36));
        }
        function decode() {
            var code = $("#content").val();
            if (code != "" && code.indexOf('eval') > -1) {
                code = code.replace(/^eval/, '');
                hightout(js_beautify(eval(code), 4, " "));
				
            }
            else {
                pcjson_com_msg($("#content"), "找不到符合条件的加密内容，无法解密");
            }
        } 


function CLASS_CONFUSION(code) {
    //哈希表类
    function Hashtable() {
        this._hash = new Object();
        this.add = function (key, value) {
            if (typeof (key) != "undefined") {
                if (this.contains(key) == false) {
                    this._hash[key] = typeof (value) == "undefined" ? null : value;
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        }
        this.remove = function (key) { delete this._hash[key]; }
        this.count = function () { var i = 0; for (var k in this._hash) { i++; } return i; }
        this.items = function (key) { return this._hash[key]; }
        this.contains = function (key) { return typeof (this._hash[key]) != "undefined"; }
        this.clear = function () { for (var k in this._hash) { delete this._hash[k]; } }

    }

    function VariableMap(parent) {
        this.table = new Hashtable();
        this.level = parent ? parent.level + 1 : 0;
        this.parent = parent;
        this.add = function (key, value) { this.table.add(key, value) };
        this.items = function (key) { return this.table.items(key) };
        this.count = function () { return this.table.count() };
        this.contains = function (key) { return this.table.contains(key); }
        this.isParameter = false;
    }

    this._caseSensitive = true;

    //字符串转换为哈希表
    this.str2hashtable = function (key, cs) {

        var _key = key.split(/,/g);
        var _hash = new Hashtable();
        var _cs = true;


        if (typeof (cs) == "undefined" || cs == null) {
            _cs = this._caseSensitive;
        } else {
            _cs = cs;
        }

        for (var i in _key) {
            if (_cs) {
                _hash.add(_key[i]);
            } else {
                _hash.add((_key[i] + "").toLowerCase());
            }

        }
        return _hash;
    }

    //获得需要转换的代码
    this._codetxt = code;

    if (typeof (syntax) == "undefined") {
        syntax = "";
    }

    this._deleteComment = false;
    //是否大小写敏感
    this._caseSensitive = true;
    //得到关键字哈希表
    this._keywords = this.str2hashtable("switch,case,delete,default,typeof,for,in,function,void,this,boolean,while,if,return,new,true,false,try,catch,throw,null,else,do,var");
    this._function = this.str2hashtable("function");
    this._var = "var";
    this._beginBlock = "{";
    this._endBlock = "}";

    this._window = this.str2hashtable("alert,escape,unescape,document,parseInt,parseFloat");
    //得到内建对象哈希表
    this._commonObjects = this.str2hashtable("String,Number,Boolean,RegExp,Error,Math,Date,Object,Array,Global");
    //得到分割字符
    this._wordDelimiters = "　 ,.?!;:\\/<>(){}[]\"'\r\n\t=+-|*%@#$^&";
    //引用字符
    this._quotation = this.str2hashtable("\",'");
    //行注释字符
    this._lineComment = "//";
    //转义字符
    this._escape = "\\";
    //多行引用开始
    this._commentOn = "/*";
    //多行引用结束
    this._commentOff = "*/";
    this._execute = "eval";
    //引用调用字符
    this._call = ".";
    this._varPause = "=";
    this._varContinue = ",";
    //变量个数
    this._varNum = 0;

    this.confusion = function () {
        var codeArr = new Array();
        var word_index = 0;
        var htmlTxt = new Array();


        //得到分割字符数组(分词)
        for (var i = 0; i < this._codetxt.length; i++) {

            if (this._wordDelimiters.indexOf(this._codetxt.charAt(i)) == -1) {        //找不到关键字
                if (codeArr[word_index] == null || typeof (codeArr[word_index]) == 'undefined') {
                    codeArr[word_index] = "";
                }
                codeArr[word_index] += this._codetxt.charAt(i);
            } else {
                if (typeof (codeArr[word_index]) != 'undefined' && codeArr[word_index].length > 0)
                    word_index++;
                codeArr[word_index++] = this._codetxt.charAt(i);
            }
        }


        var quote_opened = false;    //引用标记
        var slash_star_comment_opened = false;    //多行注释标记
        var slash_slash_comment_opened = false;    //单行注释标记
        var line_num = 1;        //行号
        var quote_char = "";        //引用标记类型
        var call_opened = false;
        var call_string = "";
        var var_opened = false;
        var var_pause = false;
        var function_opened = false;
        var parameter_opened = false;

        var var_map = new VariableMap();
        var cur_var_map = var_map;
        var execute_opened = false;

        //按分割字，分块显示
        for (var i = 0; i <= word_index; i++) {

            //单独处理指针引用
            if (call_opened && typeof (codeArr[i]) != "undefined") {
                if (call_string.length == 0) {
                    if (this.isVar(codeArr[i])) {
                        call_string += codeArr[i];
                    } else {
                        htmlTxt[htmlTxt.length] = "[\"" + this.toHex(call_string) + "\"]";
                        if (codeArr[i] != this._call) {
                            htmlTxt[htmlTxt.length] = codeArr[i];
                            call_opened = false;
                        }
                        call_string = "";
                    }
                } else {
                    if (!this.isVar(codeArr[i])) {
                        htmlTxt[htmlTxt.length] = "[\"" + this.toHex(call_string) + "\"]";
                        if (codeArr[i] != this._call) {
                            htmlTxt[htmlTxt.length] = codeArr[i];
                            call_opened = false;
                        }
                        call_string = "";
                    } else {
                        htmlTxt[htmlTxt.length] = "[\"" + this.toHex(call_string) + "\"]";
                    }
                }
                continue;
            }

            //处理空行（由于转义带来）
            if (typeof (codeArr[i]) == "undefined" || codeArr[i].length == 0) {
                continue;
            } else if (codeArr[i] == " ") {
                htmlTxt[htmlTxt.length] = " ";
            } else if (codeArr[i] == "\n") {
                //处理换行
            } else if (codeArr[i] == "\r") {
                slash_slash_comment_opened = false;
                quote_opened = false;
                var_opened = false;
                htmlTxt[htmlTxt.length] = "\r\n";
                line_num++;
                //处理function里的参数标记
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && this.isFunction(codeArr[i])) {
                htmlTxt[htmlTxt.length] = codeArr[i];
                function_opened = true;
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == "(") {
                htmlTxt[htmlTxt.length] = codeArr[i];
                if (function_opened == true) {
                    function_opened = false;
                    var_opened = true;
                    cur_var_map = new VariableMap(cur_var_map);
                    cur_var_map.isParameter = true;
                }
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == ")") {
                htmlTxt[htmlTxt.length] = codeArr[i];
                //处理var a = new Class(),b=new Date();类似的问题
                if (cur_var_map.isParameter) {
                    var_opened = false;
                    var_pause = false;
                }
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == ";") {
                htmlTxt[htmlTxt.length] = codeArr[i];
                var_opened = false;
                var_pause = false;
                if (execute_opened) {
                    execute_opened = false;
                }
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == this._var) {
                htmlTxt[htmlTxt.length] = codeArr[i];
                var_opened = true;
                var_pause = false;
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == this._varPause) {
                htmlTxt[htmlTxt.length] = codeArr[i];
                var_pause = true;
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == this._varContinue) {
                htmlTxt[htmlTxt.length] = codeArr[i];
                var_pause = false;
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == this._beginBlock) {
                cur_var_map = new VariableMap(cur_var_map);
                var_opened = false;
                htmlTxt[htmlTxt.length] = codeArr[i];
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == this._endBlock) {
                cur_var_map = cur_var_map.parent;
                if (cur_var_map.isParameter) {
                    cur_var_map = cur_var_map.parent;
                }
                htmlTxt[htmlTxt.length] = codeArr[i];
                //处理引用调用
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == this._call) {
                //判断引用(.)后面第一个是否为字母货_$
                if (i < word_index - 1) {
                    if (this.isVar(codeArr[i + 1])) {
                        if (call_opened) {
                            htmlTxt[htmlTxt.length] = this.toHex(call_string);
                        }
                        call_opened = true;
                    } else {
                        htmlTxt[htmlTxt.length] = this._call;
                    }
                } else {
                    htmlTxt[htmlTxt.length] = this._call;
                }
                //处理关键字
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && this.isKeyword(codeArr[i])) {
                htmlTxt[htmlTxt.length] = codeArr[i];
                //处理eval后的字符串
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && codeArr[i] == this._execute) {
                htmlTxt[htmlTxt.length] = "window[\"" + this.toHex(codeArr[i]) + "\"]";
                execute_opened = true;
                //window内置对象
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && this.isWindow(codeArr[i])) {
                htmlTxt[htmlTxt.length] = "window[\"" + this.toHex(codeArr[i]) + "\"]";
                //处理普通对象
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && this.isCommonObject(codeArr[i])) {
                htmlTxt[htmlTxt.length] = "window[\"" + this.toHex(codeArr[i]) + "\"]";
                //处理双引号（引号前不能为转义字符）    
            } else if (!slash_star_comment_opened && !slash_slash_comment_opened && this._quotation.contains(codeArr[i])) {
                if (quote_opened) {
                    //是相应的引号
                    if (quote_char == codeArr[i]) {
                        htmlTxt[htmlTxt.length] = codeArr[i];
                        quote_opened = false;
                        quote_char = "";
                    } else {
                        htmlTxt[htmlTxt.length] = this.toHex(codeArr[i]);
                    }
                } else {
                    htmlTxt[htmlTxt.length] = codeArr[i];
                    quote_opened = true;
                    quote_char = codeArr[i];
                }
                //处理转义字符
            } else if (codeArr[i] == this._escape) {
                htmlTxt[htmlTxt.length] = codeArr[i];
                if (i < word_index - 1) {
                    if (codeArr[i + 1].charCodeAt(0) >= 32 && codeArr[i + 1].charCodeAt(0) <= 127) {
                        htmlTxt[htmlTxt.length] = codeArr[i + 1].substr(0, 1);
                        htmlTxt[htmlTxt.length] = this.toHex(codeArr[i + 1].substr(1));
                        i = i + 1;
                    }
                }
                //处理多行注释的开始
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && this.isStartWith(this._commentOn, codeArr, i)) {
                slash_star_comment_opened = true;
                htmlTxt[htmlTxt.length] = this._commentOn;
                i = i + this.getSkipLength(this._commentOn);
                //处理单行注释
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && this.isStartWith(this._lineComment, codeArr, i)) {
                slash_slash_comment_opened = true;
                if (!this._deleteComment) {
                    htmlTxt[htmlTxt.length] = this._lineComment;
                }
                i = i + this.getSkipLength(this._lineComment);
                //处理忽略词
            } else if (!slash_slash_comment_opened && !slash_star_comment_opened && !quote_opened && this.isStartWith(this._ignore, codeArr, i)) {
                slash_slash_comment_opened = true;
                htmlTxt[htmlTxt.length] = this._ignore;
                i = i + this.getSkipLength(this._ignore);
                //处理多行注释结束    
            } else if (!quote_opened && !slash_slash_comment_opened && this.isStartWith(this._commentOff, codeArr, i)) {
                if (slash_star_comment_opened) {
                    slash_star_comment_opened = false;
                    if (!this._deleteComment) {
                        htmlTxt[htmlTxt.length] = this._commentOff;
                    }
                    i = i + this.getSkipLength(this._commentOff);
                }
            } else {
                //不是在字符串中
                if (!quote_opened) {
                    //如果不是在注释重
                    if (!slash_slash_comment_opened && !slash_star_comment_opened) {
                        //不是在定义变量时
                        if (!var_opened) {
                            if (this.translateVar(cur_var_map, codeArr[i]) == "") {
                                htmlTxt[htmlTxt.length] = codeArr[i];
                            } else {
                                htmlTxt[htmlTxt.length] = this.translateVar(cur_var_map, codeArr[i]);
                            }
                        } else {
                            //不是在暂停变量定义时
                            if (var_pause) {
                                if (this.translateVar(cur_var_map, codeArr[i]) == "") {
                                    htmlTxt[htmlTxt.length] = codeArr[i];
                                } else {
                                    htmlTxt[htmlTxt.length] = this.translateVar(cur_var_map, codeArr[i]);
                                }
                            } else {
                                //变量符合命名规则，并且（变量前为空格或制表符或逗号如：var a;var    a;var a,b;，还有如果是函数参数,如：function(a,b,c)
                                if (this.isVar(codeArr[i]) && (i > 0 && codeArr[i - 1] == " " || codeArr[i - 1] == "\t" || codeArr[i - 1] == this._varContinue || cur_var_map.isParameter)) {
                                    var name = this.getRandName();
                                    cur_var_map.add(codeArr[i], name);
                                    htmlTxt[htmlTxt.length] = this.translateVar(cur_var_map, codeArr[i]);
                                } else {
                                    htmlTxt[htmlTxt.length] = codeArr[i];
                                }
                            }
                        }
                        //注释中                            
                    } else {
                        if (!this._deleteComment) {
                            htmlTxt[htmlTxt.length] = codeArr[i];
                        }
                    }
                } else {
                    if (execute_opened) {
                        if (this.translateVar(cur_var_map, codeArr[i]) == "") {
                            htmlTxt[htmlTxt.length] = codeArr[i];
                        } else {
                            htmlTxt[htmlTxt.length] = this.translateVar(cur_var_map, codeArr[i]);
                        }
                    } else {
                        htmlTxt[htmlTxt.length] = this.toHex(codeArr[i]);
                    }
                }
            }

        }

        return htmlTxt.join("");
    }

    this.isStartWith = function (str, code, index) {

        if (typeof (str) != "undefined" && str.length > 0) {
            var cc = new Array();
            for (var i = index; i < index + str.length; i++) {
                cc[cc.length] = code[i];
            }
            var c = cc.join("");
            if (this._caseSensitive) {
                if (str.length >= code[index].length && c.indexOf(str) == 0) {
                    return true;
                }
            } else {
                if (str.length >= code[index].length && c.toLowerCase().indexOf(str.toLowerCase()) == 0) {
                    return true;
                }
            }
            return false;

        } else {
            return false;
        }
    }

    this.isFunction = function (val) {
        return this._function.contains(this._caseSensitive ? val : val.toLowerCase());
    }

    this.isKeyword = function (val) {
        return this._keywords.contains(this._caseSensitive ? val : val.toLowerCase());
    }

    this.isWindow = function (val) {
        return this._window.contains(this._caseSensitive ? val : val.toLowerCase());
    }

    this.isCommonObject = function (val) {
        return this._commonObjects.contains(this._caseSensitive ? val : val.toLowerCase());
    }

    this.getSkipLength = function (val) {
        var count = 0;
        for (var i = 0; i < val.length; i++) {
            if (this._wordDelimiters.indexOf(val.charAt(i)) >= 0) {
                count++;
            }
        }
        if (count > 0) {
            count = count - 1;
        }
        return count;
    }

    //字符串转换为16进制形式
    this.toHex = function (val) {
        var str = new Array();
        for (var i = 0; i < val.length; i++) {
            var c = val.charCodeAt(i);
            if (c >= 0 && c < 256) {
                str[str.length] = "\\x" + val.charCodeAt(i).toString(16);
            } else {
                str[str.length] = "\\u" + val.charCodeAt(i).toString(16);
            }
        }
        return str.join("");
    }

    //获得变量随机名
    this.getRandName = function () {
        var style = parseInt(Math.random() * 4);
        var len = parseInt(Math.random() * 9) + 1;
        var n = [];

        this._varNum++;
        var c = "abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$";

        for (var i = 0; i < len; i++) {
            n[n.length] = c.charAt(parseInt(Math.random() * 54));
        }

        return n.join("") + this._varNum;

    }

    //是否符合变量命名字首规则
    this.isVar = function (val) {
        return /^[a-zA-Z_\$].*$/.test(val);
    }

    //翻译变量，如果返回为空则不存在此变量
    this.translateVar = function (node, key) {
        if (node.contains(key)) {
            return node.items(key);
        }

        var cn = node.parent;
        while (cn != null) {
            if (cn.contains(key)) {
                return cn.items(key);
            }
            cn = cn.parent;
        }
        return "";
    }


}

function doConfusion(o) {
    var htmltxt = "";

    if (o == null) {
        alert("domNode is null!");
        return;
    }

    var _codetxt = "";

    if (typeof (o) == "object") {
        switch (o.tagName) {
            case "TEXTAREA":
            case "INPUT":
                _codetxt = o.value;
                break;
            case "DIV":
            case "SPAN":
                _codetxt = o.innerText;
                break;
            default:
                _codetxt = o.innerHTML;
                break;
        }
    } else {
        _codetxt = o;
    }

    var _syn = new CLASS_CONFUSION(_codetxt);
    htmltxt = _syn.confusion();
    return htmltxt;
}
 $("#BtnCon").click(function () {
		var code = $("#content").val();
		if (code != "") {
			var xx = new CLASS_CONFUSION(code);
			var a = new Date();
			hightout(xx.confusion());
		}
		else {
			pcjson_com_msg($("#content"), "请输入混淆加密内容");
		}
	});
	$("#BtnClear").click(function () {
		$("#content").val("");
		hightout("");
	});
	